import 'package:intl/intl.dart';

import 'log_utils.dart';

/// @Author lixiaobin
/// @Date 2024/1/29
/// @Description
class MyDateUtils {
  /// "yyyyMMddHHmmss" --> 'yyyy-MM-dd HH:mm:ss'
  static String format(String? str, String newPattern) {
    if (str == null) return '';
    // https://stackoverflow.com/questions/51042621/unable-to-convert-string-date-in-format-yyyymmddhhmmss-to-datetime-dart
    var s = "${str.substring(0, 8)}T${str.substring(8)}";
    return DateFormat(newPattern).format(DateTime.parse(s));
  }

  /// 时间字符串转时间戳
  /// 2023-12-08 17:01:22 转时间戳
  static int timeStringToTimestamp(String? str) {
    if (str == null) return 0;
    DateTime dateTime = DateTime.parse(str);
    int timestamp = dateTime.millisecondsSinceEpoch;
    return timestamp;
  }

  /// 时间字符串转为指定格式的时间字符串
  /// 2023-12-08 17:01:22 转为 yyyy-MM-dd HH:mm 格式
  static String timeStringToSpecifiedFormatTimeString(String? timeStr, String? newTimeFormat) {
    if (timeStr == null) return "";
    if (newTimeFormat == null) return "";
    int timestamp = timeStringToTimestamp(timeStr);
    // 从时间戳创建 DateTime 对象
    DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp);
    // 定义想要的日期时间格式 例如：'yyyy-MM-dd HH:mm'
    String format = newTimeFormat;
    // 使用 Intl 库来格式化日期时间
    String formattedDateTime = DateFormat(format).format(dateTime);
    return formattedDateTime;
  }

  /// 获取指定年份和月份的第一天日期字符串
  static String getFirstDayOfMonthString(int year, int month) {
    DateTime firstDayOfMonth = DateTime(year, month, 1);
    String formattedFirstDay = DateFormat('yyyy-MM-dd').format(firstDayOfMonth);
    return formattedFirstDay;
  }

  /// 获取指定年份和月份的最后一天日期字符串
  static String getLastDayOfMonthString(int year, int month) {
    // 构建下个月的第一天
    DateTime firstDayOfNextMonth = DateTime(year, month + 1, 1);
    // 回退一天，即为当前月的最后一天
    DateTime lastDayOfMonth = firstDayOfNextMonth.subtract(Duration(days: 1));

    String formattedLastDay = DateFormat('yyyy-MM-dd').format(lastDayOfMonth);
    return formattedLastDay;
  }

  /// 'yyyy-MM-dd HH:mm:ss' --> 1708583989232
  static int stringToInt(String? str) {
    if (str == null) return 0;
    try {
      return DateTime.parse(str).millisecondsSinceEpoch;
    } catch (e) {}
    return 0;
  }

  /// 时间（ms）转换为 --> HH:mm:ss
  static String countDown(int timeRemaining) {
    if (timeRemaining > 0) {
      timeRemaining = timeRemaining ~/ 1000;
      int h = timeRemaining ~/ (60 * 60);
      int m = timeRemaining % (60 * 60) ~/ 60;
      int s = (timeRemaining % 60);
      String h0 = '$h'.length == 1 ? '0$h' : '$h';
      String m0 = '$m'.length == 1 ? '0$m' : '$m';
      String s0 = '$s'.length == 1 ? '0$s' : '$s';
      return "$h0:$m0:$s0";
    }
    return '00:00:00';
  }

  /// 获取当前时间 - yyyy-MM-dd
  static String getCurrentDateYMD() {
    DateTime now = DateTime.now();
    String formattedDate = DateFormat('yyyy-MM-dd').format(now);
    return formattedDate;
  }

  /// 获取当前时间 - yyyy-MM-dd HH:mm:ss
  static String getCurrentDateYMDHMS() {
    DateTime now = DateTime.now();
    String formattedDate = DateFormat('yyyy-MM-dd HH:mm:ss').format(now);
    return formattedDate;
  }

  /// 获取当前时间 - 任意格式
  static String getCurrentDate(String formatted) {
    DateTime now = DateTime.now();
    String formattedDate = DateFormat(formatted).format(now);
    return formattedDate;
  }

// 格式化日期时间为字符串 - yyyy-MM-dd
  static String getFormattedDateTime(DateTime dateTime) {
    return DateFormat('yyyy-MM-dd').format(dateTime);
  }

  // 格式化日期时间为字符串 - 任意格式
  static String getAtWillFormattedDateTime(DateTime dateTime, String formatted) {
    return DateFormat(formatted).format(dateTime);
  }

  // 获取当前月份的开始时间（第一天）
  static DateTime getCurrentMonthStartDate(DateTime dateTime) {
    return DateTime(dateTime.year, dateTime.month, 1);
  }

  // 获取上个月的第一天
  static DateTime getPreviousMonthFirstDate(DateTime dateTime) {
    int year = dateTime.year;
    int month = dateTime.month - 1;

    if (month <= 0) {
      month += 12;
      year--;
    }

    return DateTime(year, month, 1);
  }

  // 获取上个月的最后一天
  static DateTime getPreviousMonthLastDate(DateTime dateTime) {
    return DateTime(dateTime.year, dateTime.month, 0);
  }

  // 获取往前推n个月的第一天
  static DateTime getPreviousNMonthsFirstDate(DateTime dateTime, int n) {
    int year = dateTime.year;
    int month = dateTime.month - n;

    while (month <= 0) {
      month += 12;
      year--;
    }

    return DateTime(year, month, 1);
  }

  // 获取往前推n个月的最后一天
  static DateTime getPreviousNMonthsLastDate(DateTime dateTime, int n) {
    int year = dateTime.year;
    int month = dateTime.month - n;

    while (month <= 0) {
      month += 12;
      year--;
    }

    return DateTime(year, month + 1, 0);
  }

  /// 月日缺少0的补齐
  static String addLeadingZero(String input) {
    // 将日期字符串按照 "-" 分割成年、月、日三个部分
    List<String> parts = input.split('-');

    // 如果月份或者日期的长度小于2，就在其前面补0
    for (int i = 0; i < parts.length; i++) {
      if (parts[i].length == 1) {
        parts[i] = '0' + parts[i];
      }
    }

    // 使用 join 方法将年、月、日再拼接成字符串
    return parts.join('-');
  }

  /// 传入时间字符串返回DateTime, 月日缺少0补齐
  static DateTime parseDateString(String dateStr) {
    List<String> dateParts = dateStr.split('-');

    int year = int.parse(dateParts[0]);
    int month = dateParts.length > 1 ? int.parse(dateParts[1]) : 1;
    int day = dateParts.length > 2 ? int.parse(dateParts[2]) : 1;

    String monthStr = month.toString().padLeft(2, '0');
    String dayStr = day.toString().padLeft(2, '0');

    return DateTime(year, int.parse(monthStr), int.parse(dayStr));
  }

  static String formatDateString(String timeString, String format) {
    // 解析字符串时间
    List<String> parts = timeString.split('-');
    int year = int.parse(parts[0]);
    int month = int.parse(parts[1]);

    // 设置日期时间
    DateTime dateTime;
    if (parts.length == 2) {
      // 只有年和月
      dateTime = DateTime(year, month, 1);
    } else if (parts.length == 3) {
      // 年月日
      int day = int.parse(parts[2]);
      dateTime = DateTime(year, month, day);
    } else {
      throw FormatException('Invalid time format: $timeString');
    }

    // 根据传入的格式化字符串创建DateFormat对象
    DateFormat formatter = DateFormat(format);

    // 格式化日期时间
    String formattedDate = formatter.format(dateTime);

    // 返回格式化后的字符串时间
    return formattedDate;
  }
}
